﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MusicDatabase
{
    /*
     * Auteur:  Joris Molnár en Niels van Leusden
     * Datum:   31-1-2013
     * Omschrijving: De klasse die communiceert tussen SQLServices, ArtistInfo en AddArtist.
     *               En slaat eventuele nieuwe artiesten op in de database.
     * 
     */
    public class Artist
    {
        private int artistID;

        public int ArtistID
        {
            get { return artistID; }
        }

        private string name;
        private string formedDate;
        private string formedCountry;
        private string notes;
        private string biography;
        private DataMode dataMode;

        public Artist()
        {
        }

        /// <summary>
        /// Er wordt een artist-object gemaakt, met extern bekende data.
        /// Met andere woorden: data afkomstig van de gebruiker.
        /// </summary>
        /// <param name="artistData"></param>
        public Artist(string[] artistData)
        {
            this.dataMode = DataMode.toevoegen;
            this.artistID = -1;
            this.name = artistData[0];
            this.formedDate = artistData[1];
            this.formedCountry = artistData[2];
            this.notes = artistData[3];
            this.biography = artistData[4];
        }

        /// <summary>
        /// Het artistID is bekend. De data wordt opgehaald uit een tabel.
        /// Dit kán natuurlijk fout gaan als het artistID niet meer bestaat.
        /// </summary>
        /// <param name="artistID"> de unieke sleutel van de artist </param>
        public Artist(int artistID)
        {
            this.dataMode = DataMode.raadplegen;
            string[] artistData = this.GetArtist(artistID);
            this.artistID = artistID;
            this.name = artistData[1];
            this.formedDate = artistData[2];
            this.formedCountry = artistData[3];
            this.notes = artistData[4];
            this.biography = artistData[5];
        }

        public string[] GetKolomNamen()
        {
            return new string[] { "artistID", "Name", "Formed Date", "Formed Country", "Notes", "Biography" };
        }

        /// <summary>
        /// De gegevens van de artist in de vorm van een string[]
        /// </summary>
        /// <returns></returns>
        public string[] GetDetails()
        {
            return new string[] { Convert.ToString(artistID), name, formedDate, formedCountry, notes, biography };
        }


        public string SelectCommand(string tabelnaam, string criteria)
        {
            return "SELECT * FROM " + tabelnaam + " " + criteria;
        }

        public string InsertCommand(string tabelnaam, string veldnamen, string velden)
        {
            return "INSERT INTO " + tabelnaam + "  (" + veldnamen + ") VALUES (" + velden + ") ";
        }


        private string veldnamen = "art_name, art_formed_date, art_formed_country, art_notes, art_biography";

        /// <summary>
        /// in geval van een nieuwe artist (dataMode == toevoegen):
        /// -- controle of de artist nieuw is
        /// -- toevoegen artist
        /// -- ophalen artist voor het toegekende "artistID"
        /// </summary>
        /// <param name="dm">DataMode: Geeft aan op welke wijze het object gesaved moet worden.</param>
        public void Save()
        {
            SQLServices sqlService = new SQLServices();
            if (this.dataMode == DataMode.toevoegen && !this.Exist(sqlService, name))
            {
                string velden = "'" + name.Replace("'", "''") + "','" + formedDate + "','" + formedCountry.Replace("'", "''") + "','" + notes.Replace("'", "''") + "','" + biography.Replace("'", "''") + "'";
                string command = InsertCommand("ARTIST", veldnamen, velden);
                sqlService.Insert(command);
                Exist(sqlService, name); // haalt het record opnieuw op voor het ArtistID...
            }
            if (this.dataMode == DataMode.toevoegen)
            {
                artistID = Convert.ToInt32(sqlService.GetVeldValue("art_id"));
            }
            this.dataMode = DataMode.raadplegen;
        }


        /// <summary>
        /// raadpleegt het record op basis van identificerende gegevens naam+geboortedatum
        /// </summary>
        /// <param name="sqlService"></param>
        /// <returns></returns>
        public bool Exist(SQLServices sqlService, string artName)
        {
            string command = SelectCommand("ARTIST",
                " WHERE art_name = '" + artName.Replace("'", "''") + "'");
            return (sqlService.Exist(command));
        }

        /// <summary>
        /// Haalt de artist-data op uit de database.
        /// </summary>
        /// <param name="artistID"> uniek id van de artist</param>
        /// <returns>string[] met de artistdata</returns>
        private string[] GetArtist(int artistID)
        {
            SQLServices sqlService = new SQLServices();
            string command = SelectCommand("ARTIST", " WHERE art_id = " + artistID);
            return sqlService.GetTable(command)[1];
        }
    }
}
